package org.ws.edu.task1.jimotozka;

import org.ws.edu.task1.ICalculator;

public class JimotozkaCalculator implements ICalculator {
    private static final char PLUS = '+';
    private static final char MINUS = '-';
    private static final char MULTIPLY = '*';
    private static final char DIVIDE = '/';
    private static final char POW = '^';

    double calculate(final double a1, final double a2, final String oper) {
        switch (oper.charAt(0)) {
            case PLUS:
                return sum(a2, a1);
            case MINUS:
                return diff(a2, a1);
            case MULTIPLY:
                return multiply(a2, a1);
            case DIVIDE:
                return divide(a2, a1);
            case POW:
                return pow(a2, a1);
        }
        return 0;
    }

    @Override
    public int sum(final int a1, final int a2) {
        return a1 + a2;
    }

    public double sum(final double a1, final double a2) {
        return a1 + a2;
    }

    @Override
    public long factorial(final int n) {
        long ret = 1;
        for (int i = 1; i <= n; ++i) {
            ret *= i;
        }
        return ret;
    }

    public double diff(final double a1, final double a2) {
        return a1 - a2;
    }

    public double multiply(final double a1, final double a2) {
        return a1 * a2;
    }

    public double divide(final double a1, final double a2) {
        return a1 / a2;
    }

    /*
     * так как корень n степени это возведение в степень 1/n,
     * то чтобы получить корень какой-либо степени n передаём
     * в качестве второго аргумента 1/n
     * Пример:
     * 4^0.5 = 2
     */
    public double pow(final double a1, final double a2) {
        return Math.pow(a1, a2);
    }

}
